package JavaShengSai2;

/**
 * 5. 子串分值和
 * https://www.lanqiao.cn/problems/1037/learning/?page=2&first_category_id=1&tags=2020,%E7%9C%81%E8%B5%9B&tag_relation=intersection&sort=pass_rate&asc=0
 */

import java.util.Scanner;

/**
 对于这个就是要 以某一个字符为基础 进行保证这个字符必须是有效的1
 那么对于 这个字符之前的字符不能再存在这个字符，保证这个字符是第一个出现的，对于后面出现相同的字符是无所谓的
 所以这个 对于以某个字符为基准的子字符串 只需要计算这个最大字符串长度即可
 公式就是：(本次出现的位置 - 这个前面第一出现的位置) * (将来最近一次出现的位置 - 本次出现的位置)
 那么这里的 将来最近一次出现的位置 就是整个字符串的长度，也就是最后一个位置，因为后面出现也是无所谓的，也会进行计算1个值
 */
public class Main5 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        String str = scan.nextLine();
        char[] ch = str.toCharArray();
        int[] arr = new int[26]; // 记录某个单词出现的位置
        //将每个字符对应的位置设为-1，是为了保证第一次出现的字符有结果
        // 因为第一个字符前面是没有的，所以要乘以1，这样第一个字符的时候，减去-1，就是 0-(-1)为 1
        for(int i = 0;i < 26;i++) {
            arr[i] = -1;
        }
        long ret = 0;
        int willIndex = ch.length;
        for(int i = 0;i < ch.length;i++) {
            int pre = arr[ch[i] - 'a'];
            ret += (long) (i - pre) * (willIndex - i); // 这里不能写成 ((i - pre) * (willIndex - i)) 这样数据太大就会丢失数据，应该先转换成long
            // 更新出现的字符位置
            arr[ch[i] - 'a'] = i;
        }
        System.out.println(ret);
        scan.close();
    }
}
